#ifndef cathlibcpp_numeric_H
#define cathlibcpp_numeric_H

// File:       numeric.h
// Author:     Acorn C/C++ port (c) Miles Sabin, 1997
// Purpose:    approximation to ANSI C++ numeric ops

// Copyright (c) 1994
// Hewlett-Packard Company
//
// Permission to use, copy, modify, distribute and sell this software
// and its documentation for any purpose is hereby granted without fee,
// provided that the above copyright notice appear in all copies and
// that both that copyright notice and this permission notice appear
// in supporting documentation.  Hewlett-Packard Company makes no
// representations about the suitability of this software for any
// purpose.  It is provided "as is" without express or implied warranty.


#ifndef cathlibcpp_config_H
#include "config.h"
#endif


// accumulate

template<class InputIterator, class T>
T accumulate(InputIterator first, InputIterator last, T init);

template<class InputIterator, class T, class BinaryOperation>
T accumulate(InputIterator first, InputIterator last, T init, BinaryOperation binary_op);


// inner_product

template<class InputIterator1, class InputIterator2, class T>
T inner_product(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, T init);

template<class InputIterator1, class InputIterator2, class T, class BinaryOperation1, class BinaryOperation2>
T inner_product
  (InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, T init,
   BinaryOperation1 binary_op1, BinaryOperation2 binary_op2);


// partial_sum

template<class InputIterator, class OutputIterator>
OutputIterator partial_sum(InputIterator first, InputIterator last, OutputIterator result);

template<class InputIterator, class OutputIterator, class BinaryOperation>
OutputIterator
  partial_sum(InputIterator first, InputIterator last, OutputIterator result, BinaryOperation binary_op);


// adjacent_difference

template<class InputIterator, class OutputIterator>
OutputIterator adjacent_difference(InputIterator first, InputIterator last, OutputIterator result);

template<class InputIterator, class OutputIterator, class BinaryOperation>
OutputIterator
  adjacent_difference(InputIterator first, InputIterator last, OutputIterator result, BinaryOperation binary_op);


// iota

template<class ForwardIterator, class T>
inline void iota(ForwardIterator first, ForwardIterator last, T value)
{
  while(first != last)
  {
    *first = value;
    ++first;
    ++value;
  }
}

#endif
